<template>
  <div class="dashboard-container">
    <div class="app-container">
      <el-card class="tree-card">
        <div class="dataHeader">
          <el-tabs v-model="activeName">
            <el-tab-pane label="组织架构" name="first" />
          </el-tabs>
        </div>
        <div class="dataBody">
          <!-- 用了一个行列布局 -->
          <TreeTools :data="company" :is-root="true" />
          <hr>
          <!-- 树形结构 -->
          <el-tree
            :data="departs"
            :props="defaultProps"
            :default-expand-all="true"
          >
            <!-- 这里是插槽, 每个树形节点都会渲染出一行 -->
            <!-- 利用作用域插槽的方式, 获取内部的每个节点数据 -->
            <!-- 拿到了 scope 以后,当a前节点的数据就在 scope.data 当中 -->
            <!-- tree-tools 通过emit(***) 传参，index通过@***获取，并触发对应的函数 -->
            <TreeTools
              slot-scope="{ data }"
              :data="data"
              @addDepts="addDepts"
              @delDepts="loadPage"
              @editDepts="editDepts"
            />
          </el-tree>
        </div>
      </el-card>
    </div>
    <!-- 这里把showDialog传出去add子组件 -->
    <!-- 如果子组件的自定义事件是
    update:字段名,
    在父组件就可以给这个字段带上一个
    .sync 修饰符, 同步数据 -->
    <!-- ref可以通过父组件直接调用子组件里面的函数 -->
    <AddDept ref="deptDialog" :show-dialog.sync="showDialog" :data="node" @addDepts="loadPage" />
  </div>
</template>

<script>
import TreeTools from './components/tree-tools'
import AddDept from './components/add-dept'
import { getDepartments } from '@/api/departments'
import { convertTreeData } from '@/utils'

export default {
  components: {
    TreeTools,
    AddDept
  },
  data() {
    return {
      showDialog: false,
      activeName: 'first',
      departs: [],
      defaultProps: {
        label: 'name',
        children: 'children'
      },
      company: {},
      node: {}
    }
  },
  created() {
    this.loadPage()
  },
  methods: {
    addDepts(node) {
      // 这里是属性组件点击增加子部门时的函数
      // 1. 弹出弹窗
      this.showDialog = true
      // 2. 将子部门传出来的数据存起来备用
      this.node = node
    },
    editDepts(node) {
      this.showDialog = true
      this.node = node
      // 编辑时除了弹窗和记录数据
      // 还得通知子组件回显数据
      // 而且这里要等上面的弹出框渲染出来再执行数据回显,$nextTick起到上面执行完再渲染的作用相当于延时器
      this.$nextTick(() => {
        this.$refs.deptDialog.getDepartmentDetails()
      })
    },
    loadPage() {
      getDepartments().then(res => {
        console.log(res)
        this.company = {
          name: res.companyName,
          manager: '负责人',
          id: ''
        }
        // this.departs = res.depts
        // 不能直接将扁平数据传入组件, 要先将数据转换成树状格式
        this.departs = convertTreeData(res.depts, '')
      })
    }
  }
}
</script>

<style scoped>
.tree-card .dataBody {
  padding: 10px 140px;
  font-size: 14px;
}
.tree-card .dataHeader {
  padding: 10px 50px;
}
</style>
